/**
 * @file main.cpp
 * @brief 云存储系统主程序入口
 * @details 基于sogou/workflow框架的高性能云存储服务器
 * @version 1.0
 */

#include <workflow/WFFacilities.h>
#include <workflow/HttpUtil.h>
#include <signal.h>
#include "http_server.h"
#include "storage_manager.h"
#include "database_manager.h"
#include "sysconfig.h"
#include "logger.hpp"

static WFFacilities::WaitGroup wait_group(1);

/**
 * @brief 信号处理函数，用于优雅关闭服务器
 * @param signo 信号编号
 */
void sig_handler(int signo) 
{
    Log::GetLogger("asynclogger")->Info("正在关闭服务器...");
    wait_group.done();
}

void start_log()
{
    std::shared_ptr<Log::LoggerBuilder> Glb(new Log::LoggerBuilder());
    Glb->BuildLoggerName("asynclogger");
    Glb->BuildLoggerFlush<Log::FileFlush>("./logfile/FileFlush.log");
    // Glb->BuildLoggerFlush<Log::RollFileFlush>("./logfile/RollFile_log", 1024 * 1024);

    Log::LoggerMgr::Instance().AddLogger(Glb->Build());
}

/**
 * @brief 主函数
 * @param argc 命令行参数个数
 * @param argv 命令行参数数组
 * @return int 程序退出码
 */
int main(int argc, char* argv[]) 
{
    // 注册信号处理
    signal(SIGINT, sig_handler);
    signal(SIGTERM, sig_handler);
    start_log();
    Log::GetLogger("asynclogger")->Info("启动云存储服务器...");

    try {
        // 初始化配置
        Config::init();
        
        // 初始化数据库
        if (!DatabaseManager::getInstance().init()) {
            Log::GetLogger("asynclogger")->Info("数据库初始化失败");
            return -1;
        }
        
        // 初始化存储管理器
        if (!StorageManager::getInstance().init()) 
        {
            Log::GetLogger("asynclogger")->Info("存储管理器初始化失败");
            return -1;
        }
        
        // 创建HTTP服务器
        HttpServer server(Config::getPort());
        
        // 启动服务器
        if (!server.start()) 
        {
            Log::GetLogger("asynclogger")->Fatal("服务器启动失败 msg: %s");
            return -1;
        }
        
        Log::GetLogger("asynclogger")->Info("服务器已启动，监听端口: %d", Config::getPort());
        Log::GetLogger("asynclogger")->Info("访问地址: http://localhost:%d", Config::getPort());
        
        // 等待退出信号
        wait_group.wait();
        
        // 清理资源
        server.stop();
        StorageManager::getInstance().cleanup();
        DatabaseManager::getInstance().cleanup();
        
        Log::GetLogger("asynclogger")->Info("服务器已关闭");
    } catch (const std::exception& e) {
        Log::GetLogger("asynclogger")->Info("程序异常: %s", e.what());
        return -1;
    }
    
    return 0;
} 